package com.example.meterialproject.view.behavior.demo1;

import android.annotation.SuppressLint;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.OverScroller;
import android.widget.Scroller;

/*
 * 作者:android 超级兵
 * 创建时间: 4/12/22 3:52 PM
 * TODO Scroller
 */
public class DragView extends View {
    private int lastX;
    private int lastY;
    private final OverScroller mScroller;

    public DragView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mScroller = new OverScroller(context);
    }

    @SuppressLint("ClickableViewAccessibility")
    public boolean onTouchEvent(MotionEvent event) {
        //获取到手指处的横坐标和纵坐标
        int x = (int) event.getX();
        int y = (int) event.getY();
        View parent = ((View) getParent());

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                lastX = x;
                lastY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                //计算移动的距离
                int offX = x - lastX;
                int offY = y - lastY;
                Log.e("DragViewMOVE", parent.getClass().getPackage().getName()
                        + "-" + parent.getClass().getSimpleName()
                );
                parent.scrollBy(-offX, -offY);
                break;
            case MotionEvent.ACTION_UP:
                Log.i("DragView",
                        "parentScrollX:" + parent.getScrollX()
                                + "parentScrollY:" + parent.getScrollY()
                                + "scrollY:" + getScrollX()
                                + "scrollY:" + getScrollY()
                );
                //开启滑动,让其回到原点
                mScroller.startScroll(
                        parent.getScrollX(),
                        parent.getScrollY(),
                        -parent.getScrollX(), // 结束点x
                        -parent.getScrollY() // 结束点y
                );
                break;
        }

        return true;
    }


    /*
     * 作者:android 超级兵
     * 创建时间: 4/13/22 4:17 PM
     * TODO 完成滑动时候调用
     */
    @Override
    public void computeScroll() {
        super.computeScroll();
//        computeScrollOffset方法用来判断是否完成了整个滑动，返回为true，则说明没有完成，否则则完成滑动。
        if (mScroller.computeScrollOffset()) {
            //  getCurrY() 以及 getCurrX() 获得的是当前的滑动坐标。
            ((View) getParent()).scrollTo(mScroller.getCurrX(),
                    mScroller.getCurrY());
        }
//        最后必须要用 invalidate 方法来刷新。
//        因为 computeScroll方法不会自动调用,是在 draw 方法中被调用的。
//        所以必须使用 invalidate 刷新，就会调用 draw 方法，
//        自然就会调用 computeScroll 方法了。这样子就会实现循环调用。
        invalidate();
    }
}

